<?php
declare(strict_types=1);
namespace App\Service\Goods\Products;

use App\Models\Goods\Product;
class ProductsShow implements ProductsInterface{

    public function index($request){
       // 创建一个查询构造器
       $builder = Product::query()->where('on_sale', true);
       // 判断是否有提交 search 参数，如果有就赋值给 $search 变量
       // search 参数用来模糊搜索商品
       if ($search = $request->input('search', '')) {
           $like = '%'.$search.'%';
           // 模糊搜索商品标题、商品详情、SKU 标题、SKU描述
           $builder->where(function ($query) use ($like) {
               $query->where('title', 'like', $like)
                   ->orWhere('description', 'like', $like)
                   ->orWhereHas('skus', function ($query) use ($like) {
                       $query->where('title', 'like', $like)
                           ->orWhere('description', 'like', $like);
                   });
           });
       }

       // 是否有提交 order 参数，如果有就赋值给 $order 变量
       // order 参数用来控制商品的排序规则
       if ($order = $request->input('order', '')) {
           // 是否是以 _asc 或者 _desc 结尾
           if (preg_match('/^(.+)_(asc|desc)$/', $order, $m)) {
               // 如果字符串的开头是这 3 个字符串之一，说明是一个合法的排序值
               if (in_array($m[1], ['price', 'sold_count', 'rating'])) {
                   // 根据传入的排序值来构造排序参数
                   $builder->orderBy($m[1], $m[2]);
               }
           }
       }

       $products = $builder->paginate(16);
       return ['products'=>$products,'search'=>$search,'order'=>$order];
    }
    public function favored($request,$product){
        $favored = false;
        if($user = $request->user()) {
            // 从当前用户已收藏的商品中搜索 id 为当前商品 id 的商品
            // boolval() 函数用于把值转为布尔值
            $favored = boolval($user->favoriteProducts()->find($product->id));
        }
        return $favored;
    }
    public function favor($request,$product){
        $user = $request->user();
        if ($user->favoriteProducts()->find($product->id)) {
            return [];
        }

        $user->favoriteProducts()->attach($product);

        return [];
    }
    public function disfavor($request,$product){
        $user = $request->user();
        $user->favoriteProducts()->detach($product);
        return [];
    }
}
